package com.yunhe.authority.service.base;

import com.yunhe.common.model.PageParam;
import com.yunhe.authority.domain.base.Theme;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 主题Service
 * @desc 主题服务类定义
 * @author liuronglei
 */
public interface ThemeService {
    /**
     * 新增主题
     * @param theme 新增对象
     */
    @Transactional
    Theme createTheme(Theme theme)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 批量新增主题
     * @param list 主题列表
     */
    @Transactional
    Iterable<Theme> createTheme(List<Theme> list)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 根据id删除主题
     * @param themeId id
     */
    @Transactional
    void deleteTheme(Long themeId);

    /**
     * 根据主题代码删除主题
     * @param code 主题代码
     */
    @Transactional
    Long deleteThemeByCode(Long code);

    /**
     * 根据主题编号删除主题
     * @param name 主题编号
     */
    @Transactional
    Long deleteThemeByName(String name);

    /**
     * 更新主题（更新全部字段）
     * @param theme 要更新的主题对象
     */
    @Transactional
    Theme updateTheme(Theme theme)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 更新主题（更新指定字段）
     * @param themeId id
     * @param code 主题代码
     * @param name 主题编号
     * @param title 主题标题
     */
    @Transactional
    Theme updateTheme(Long themeId,
                      Long code,
                      String name,
                      String title)
            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID获得主题对象
     * @param id id
     */
    Theme findByThemeId(Long id);

    /**
     * 根据主题代码获得主题对象
     * @param code 主题代码
     */
    Theme findByCode(Long code);

    /**
     * 根据主题编号获得主题对象
     * @param name 主题编号
     */
    Theme findByName(String name);

    /**
     * 根据主题标题获得主题对象
     * @param title 主题标题
     */
    Theme findByTitle(String title);

    /**
     * 获得所有主题对象
     * @param pageParam 分页对象
     */
    Iterable<Theme> findThemes(PageParam pageParam);

}
